Packages

pacman::p_load(dplyr, ggplot2, readr, haven, broom, purrr, tidyr, magrittr, labelled, sjPlot, viridis, forcats, ggthemes, cluster, factoextra, fpc)
Warnmeldung:
In scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  :
  EOF in Zeichenkette

Data

Trust

First we explore the diemnionality of the given trust items by applying standard pairwise scatterplots for euch variable combination and principal component analysis (efa) gain information on the distribution of variance in the data. After that conformatory factor analysis scores are computed for one trust dimesnion and merged for later analysis.

trust_data_id <- ess %>%
  select(id, contains("trust")) %>%
  na.omit() 
Adding missing grouping variables: `country`
trust_data <- trust_data_id %>% select(-id)

Exploratory Analysis

ggsave(pm, filename = "ggpairs_trust.png", width = 10, height = 10)

 plot: [1,1] [==---------------------------------------------------------]  3% est: 0s 
 plot: [1,2] [===--------------------------------------------------------]  6% est: 6s 
 plot: [1,3] [=====------------------------------------------------------]  8% est: 5s 

PCA

fit_pca1
Standard deviations (1, .., p=6):
[1] 1.9998351 0.8705619 0.7326286 0.5802898 0.5019986 0.3424879

Rotation (n x k) = (6 x 6):
                    PC1         PC2         PC3         PC4         PC5          PC6
trust_parl   -0.4330921  0.01693392  0.24442925  0.57938071  0.64273074 -0.060116704
trust_leg    -0.4106188  0.44394227 -0.03835526  0.43519919 -0.66590819  0.002073199
trust_police -0.3634767  0.65321791 -0.19860361 -0.55263982  0.30982018 -0.018663788
trust_pol    -0.4442765 -0.29676209  0.32188720 -0.26088247 -0.11065888  0.728446463
trust_party  -0.4369146 -0.34579189  0.30556848 -0.31154844 -0.18444877 -0.681966097
trust_eu     -0.3513292 -0.41023786 -0.83806704  0.06623285  0.03475911  0.017925945
### Screeplot: Eigenvalues
fviz_eig(fit_pca1, addlabels = T, ylim = c(0, 80))

fviz_pca_var(fit_pca1, col.var = "black")

# Color by cos2 values: quality on the factor map
fviz_pca_var(
  fit_pca1, 
  col.var = "cos2",
  gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
  repel = TRUE # Avoid text overlapping
)

# Graph of individuals
# fviz_pca_ind(fit_pca1)
# Total cos2 of variables on Dim.1 and Dim.2
fviz_cos2(fit_pca1, choice = "var", axes = 1:2)

# Contributions of variables to PC1
fviz_contrib(fit_pca1, choice = "var", axes = 1, top = 10)

# Contributions of variables to PC2
fviz_contrib(fit_pca1, choice = "var", axes = 2, top = 10)

# The total contribution to PC1 and PC2 is obtained with
fviz_contrib(fit_pca1, choice = "var", axes = 1:3, top = 10)

Factor Analysis

\[f(x_i) = \frac{1}{2\pi^{p/2}|\Sigma|^{1/2}}e^{-\frac{1}{2}(x_i-\mu)^T\Sigma^{-1} (x_i-\mu)}\]

In addition, the covariance matrix is modelled by a structure of common factors accounting for a joint component of variance and specific residual variances for each variable:

\[\Sigma = \Lambda\Lambda^T + D_\psi\]

Need to first: write out the likelihood, and then maximize it!!! Easier to start with a one-factor solution…

\[\Sigma = \lambda\lambda^T + D_\psi\]

Factor Rotations

The factor loadings matrix is usually rotated or re-oriented in order to receive uncorrelated factors/ components. The goal is to find clusters of variables that are highly correlated and to large extend define only one factor.

  • Orthogonal rotation: preserves the perpendicularity of the axes (remain uncorrelated)
    • Varimax: preserves simple structure by focusing on the columns of the factor loadings matrix. The Kaiser`s varimax rotation aims to maximize the independent squared loadings variance across variables summed over all factors.
    • Quartimax rotation - preserves simple structure by focusing on the rows of the factor loading matrix
  • **Oblique rotation - allows for correlation between the rotated factors. The purpose is to align th efactor axes as closely as possible to the groups of the original variables. The goal is to facilitate the interpretation of the results (more distrimative).
  • Promax rotation

Common factor model - observed variance in each measure is attributable to a relatively small number of common factors and a single speficif factor (uncorrelated to other factors in the model).

my opinion

\[x_{i1} = \lambda_1\xi_{i1} + \lambda_2\xi_{i2} + ... + \delta_i \]

her opinion:

\[x_{i} = \lambda_{i1}\xi_1 + \lambda_{i2}\xi_2 + ... + \delta_i \]

The common analysis is appropriate when there is a latent trait or unobservable characteristics. Used within suervey questions about attitudes. The goal is to identify common factors captering the variance from these questions and which can also be used as factor scores.

  • Assumptions to determine a solution to the common factor model:
    • The common factors are uncorrelated with each other
    • The specific factors are uncorrelated with each other.
    • The common factors and specific factors are uncorrelated with each other.
  • The communality is the proportion of variance in X attributable to the common factors

\[h_i^2 = \sum_k \lambda^2_{ik} = 1- \theta_{ik}^2\] where \(\theta_{ik}^2 = var(\delta_i)\) is the fcator uniqueness. * The solution to the common factor model is determined by orienting the first factor so that it captures the greatest possible varinace but is uncorrelated with the first factor. * The correlation between X variables and the … factors are called loadings \(\Lambda\). * The factor scores present the psoitions of the observations in the common factor space. The factpr score coefficients are given by

\[B = R^{-1}\Lambda_c\]

where R is the correlation matrix * The factor scores are calculated as:

\[\Xi = X_SB\] These factor scores are included in the data and can be used instead of the original variables.

library(ggplot2)
library(survival)
data(lung, package = "survival")
summary(ess$rel)
ess_surv <- ess
ess_surv$year <- 2017 - ess_surv$year 
sf.ess <- survival::survfit(Surv(year, gndr) ~ 1, data = ess_surv)
ggsurv(sf.ess)
LS0tCnRpdGxlOiAiRVNTIEZhY3RvciBBbmFseXNpcyIKc3VidGl0bGU6ICJGYWN0b3IgU2NvcmVzIgphdXRob3I6ICJSZWJlY2NhICYgU2ltb24gIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBQYWNrYWdlcwoKYGBge3J9CnBhY21hbjo6cF9sb2FkKGRwbHlyLCBnZ3Bsb3QyLCByZWFkciwgaGF2ZW4sIGJyb29tLCBwdXJyciwgdGlkeXIsIG1hZ3JpdHRyLCBsYWJlbGxlZCwgc2pQbG90LCB2aXJpZGlzLCBmb3JjYXRzLCBnZ3RoZW1lcywgY2x1c3RlciwgZmFjdG9leHRyYSwgZnBjKQpgYGAKCiMjIERhdGEKCmBgYHtyfQplc3MgPC0gZ2V0KGxvYWQoImRhdGEvUmRhdGEvZXNzX2ZpbmFsLlJkYXRhIikpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShpZCA9IHBhc3RlMChpc28yLCAxOm4oKSkpCmBgYAoKCiMjIFRydXN0IAoKRmlyc3Qgd2UgZXhwbG9yZSB0aGUgZGllbW5pb25hbGl0eSBvZiB0aGUgZ2l2ZW4gdHJ1c3QgaXRlbXMgYnkgYXBwbHlpbmcgc3RhbmRhcmQgcGFpcndpc2Ugc2NhdHRlcnBsb3RzIGZvciBldWNoIHZhcmlhYmxlIGNvbWJpbmF0aW9uIGFuZCBwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzIChlZmEpIGdhaW4gaW5mb3JtYXRpb24gb24gdGhlIGRpc3RyaWJ1dGlvbiBvZiB2YXJpYW5jZSBpbiB0aGUgZGF0YS4gQWZ0ZXIgdGhhdCBjb25mb3JtYXRvcnkgZmFjdG9yIGFuYWx5c2lzIHNjb3JlcyBhcmUgY29tcHV0ZWQgZm9yIG9uZSB0cnVzdCBkaW1lc25pb24gYW5kIG1lcmdlZCBmb3IgbGF0ZXIgYW5hbHlzaXMuCgoKYGBge3J9CnRydXN0X2RhdGFfaWQgPC0gZXNzICU+JQogIHNlbGVjdChpZCwgY29udGFpbnMoInRydXN0IikpICU+JQogIG5hLm9taXQoKSAKCnRydXN0X2RhdGEgPC0gdHJ1c3RfZGF0YV9pZCAlPiUgc2VsZWN0KC1pZCkKYGBgCgojIyMgRXhwbG9yYXRvcnkgQW5hbHlzaXMKCmBgYHtyfQpsaWJyYXJ5KEdHYWxseSkKCnRydXN0X3NjYXR0ZXIgPC0gZnVuY3Rpb24oZGF0YSwgbWFwcGluZywgLi4uKSB7CiAgZ2dwbG90KGRhdGEgPSBkYXRhLCBtYXBwaW5nID0gbWFwcGluZykgKwogICAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAuMDEsIGNvbG9yID0gIiMzRDNEM0QiKSArIAogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gInNtb290aCIsIGNvbG9yID0gInJlZCIpCn0KCnRydXN0X2hpc3QgPC0gZnVuY3Rpb24oZGF0YSwgbWFwcGluZywgLi4uKSB7CiAgZ2dwbG90KGRhdGEgPSBkYXRhLCBtYXBwaW5nID0gbWFwcGluZykgKwogICAgZ2VvbV9iYXIoZmlsbCA9ICIjM0QzRDNEIiwgYWxwaGEgPSAuOSwgY29sb3IgPSAiIzNEM0QzRCIpCn0KCnBtIDwtIGdncGFpcnMoCiAgdHJ1c3RfZGF0YSwgCiAgI2NvbHVtbnMgPSBjKCJ0b3RhbF9iaWxsIiwgInRpbWUiLCAidGlwIiksCiAgZGlhZyA9IGxpc3QoY29udGludW91cyA9IHdyYXAodHJ1c3RfaGlzdCkpLAogIGxvd2VyID0gbGlzdCgKICAgICNjb21ibyA9IHdyYXAoImZhY2V0aGlzdCIsIGJpbndpZHRoID0gMSksCiAgICBjb250aW51b3VzID0gd3JhcCh0cnVzdF9zY2F0dGVyKQogICkKKSArIGdndGhlbWVzOjp0aGVtZV9nZG9jcygpCgpwbQojZ2dzYXZlKHBtLCBmaWxlbmFtZSA9ICJnZ3BhaXJzX3RydXN0LnBuZyIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwKQojZ2dwYWlycyhmYV9kYXRhLCB0eXBlcyA9IGxpc3QoY29udGludW91cyA9IHdyYXAobXlfYmluLCBiaW53aWR0aCA9IGMoNSwgMC41KSwgaGlnaCA9ICJyZWQiKSkpCmBgYAoKIVtdKGdncGFpcnNfdHJ1c3QucG5nKQoKCiMjIFBDQSAKCmBgYHtyfQpmaXRfcGNhMSA8LSB0cnVzdF9kYXRhICU+JQogIHNjYWxlKCkgJT4lCiAgcHJjb21wKCkKYGBgCgpgYGB7cn0KIyMjIFNjcmVlcGxvdDogRWlnZW52YWx1ZXMKZnZpel9laWcoZml0X3BjYTEsIGFkZGxhYmVscyA9IFQsIHlsaW0gPSBjKDAsIDgwKSkKCmZ2aXpfcGNhX3ZhcihmaXRfcGNhMSwgY29sLnZhciA9ICJibGFjayIpCgojIENvbG9yIGJ5IGNvczIgdmFsdWVzOiBxdWFsaXR5IG9uIHRoZSBmYWN0b3IgbWFwCmZ2aXpfcGNhX3ZhcigKICBmaXRfcGNhMSwgCiAgY29sLnZhciA9ICJjb3MyIiwKICBncmFkaWVudC5jb2xzID0gYygiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNGQzRFMDciKSwgCiAgcmVwZWwgPSBUUlVFICMgQXZvaWQgdGV4dCBvdmVybGFwcGluZwopCiMgR3JhcGggb2YgaW5kaXZpZHVhbHMKIyBmdml6X3BjYV9pbmQoZml0X3BjYTEpCgojIFRvdGFsIGNvczIgb2YgdmFyaWFibGVzIG9uIERpbS4xIGFuZCBEaW0uMgpmdml6X2NvczIoZml0X3BjYTEsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMToyKQoKIyBDb250cmlidXRpb25zIG9mIHZhcmlhYmxlcyB0byBQQzEKZnZpel9jb250cmliKGZpdF9wY2ExLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDEsIHRvcCA9IDEwKQojIENvbnRyaWJ1dGlvbnMgb2YgdmFyaWFibGVzIHRvIFBDMgpmdml6X2NvbnRyaWIoZml0X3BjYTEsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMiwgdG9wID0gMTApCiMgVGhlIHRvdGFsIGNvbnRyaWJ1dGlvbiB0byBQQzEgYW5kIFBDMiBpcyBvYnRhaW5lZCB3aXRoCmZ2aXpfY29udHJpYihmaXRfcGNhMSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxOjMsIHRvcCA9IDEwKQpgYGAKCgoKIyMgRmFjdG9yIEFuYWx5c2lzCgpgYGB7cn0KZmFfdHJ1c3QgPC0gdHJ1c3RfZGF0YSAlPiUKICBmYWN0YW5hbCguLCBmYWN0b3JzID0gMSwgc2NvcmVzID0gJ3JlZ3Jlc3Npb24nKQoKdHJ1c3RfZGF0YV9pZCR0cnVzdF9zY29yZXMgPC0gZmFfdHJ1c3Qkc2NvcmVzWywxXQp0cnVzdF9kYXRhX2lkJHRydXN0X3Njb3JlcyAlPiUgaGVhZApgYGAKCgpgYGB7cn0KZGQgPC0gdHJ1c3RfZGF0YV9pZCAlPiUgc2VsZWN0KGlkLCB0cnVzdF9zY29yZXMpCmVzc19zY29yZSA8LSBlc3MgJT4lCiAgZHBseXI6OmxlZnRfam9pbihkZCkKCiNzYXZlKGVzc19zY29yZSwgZmlsZSA9ICJkYXRhL1JkYXRhL2Vzc19zY29yZS5SZGF0YSIpCmBgYAoKCgoKKiBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGlvbgoqIEFzc3VtcHRpb25zOiBFYWNoIHJvdyAkeF9pJCBvZiBYIGlzIGFuIGluZGVwZW5kZW50IHNhbXBsZSBmcm9tIGEKbXVsdGl2YXJpYXRlIG5vcm1hbCBkaXN0cmlidXRpb24sIHdoaWNoIGhhcyB0aGUgZGVuc2l0eSBmdW5jdGlvbjoKCiQkZih4X2kpID0gXGZyYWN7MX17MlxwaV57cC8yfXxcU2lnbWF8XnsxLzJ9fWVeey1cZnJhY3sxfXsyfSh4X2ktXG11KV5UXFNpZ21hXnstMX0gKHhfaS1cbXUpfSQkCgpJbiBhZGRpdGlvbiwgdGhlIGNvdmFyaWFuY2UgbWF0cml4IGlzIG1vZGVsbGVkIGJ5IGEgc3RydWN0dXJlIG9mIGNvbW1vbiBmYWN0b3JzIGFjY291bnRpbmcgZm9yIGEgam9pbnQgY29tcG9uZW50IG9mIHZhcmlhbmNlIGFuZCBzcGVjaWZpYyByZXNpZHVhbCB2YXJpYW5jZXMgZm9yIGVhY2ggdmFyaWFibGU6CgokJFxTaWdtYSA9IFxMYW1iZGFcTGFtYmRhXlQgKyBEX1xwc2kkJAoKTmVlZCB0byBmaXJzdDogd3JpdGUgb3V0IHRoZSBsaWtlbGlob29kLCBhbmQgdGhlbiBtYXhpbWl6ZSBpdCEhIQoqRWFzaWVyKiB0byBzdGFydCB3aXRoIGEgb25lLWZhY3RvciBzb2x1dGlvbi4uLgoKJCRcU2lnbWEgPSBcbGFtYmRhXGxhbWJkYV5UICsgRF9ccHNpJCQKCiogVGhlIHByb3BvcnRpb24gb2YgdGhlIHZhcmlhbmNlIGluIGVhY2ggb3JpZ2luYWwgdmFyaWFibGUgJHhfZCQgYWNjb3VudGVkIGZvciBieSB0aGUgZmlyc3QgJFBDXzEkIGdpdmVuIGJ5IHRoZSBzdW0gb2YgdGhlIHNxdWFyZWQgZmFjdG9yIGxvYWRpbmdzOyB0aGF0IGlzICRcc3VtXmNfe2s9MX0gZl4yX3tpa30kLiBXaGVuIGM9cCAoYWxsIGNvbXBvbmVudHMgYXJlIHJldGFpbmVkKS4gJCRcc3VtXmNfe2s9MX0gZl4yX3tpa309MSQgKGFsbCB2YXJpYW5jZSBpcyBleHBsYWluZWQpCgoqIEZhY3RvciBsb2FkaW5ncyBhcmUgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBvcmlnaW5hbCB2YXJpYWJsZXMgeCBhbmQgdGhlIGNvbXBvbmVudHMgUEMsIGRlbm90ZWQgYXMgJEYgPSBjb3IoeCwgUEMpID0gdUReezEvMn0kLiBJbnRlcm5hbCBWYWxpZGF0aW9uIG1lYXN1cmUgdG8gc2VlIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHByZWRpY3RvcnMgYW5kIGV4dHJhY3RlZCBjb21wb25lbnRzLgoKCiMjIyBGYWN0b3IgUm90YXRpb25zCgpUaGUgZmFjdG9yIGxvYWRpbmdzIG1hdHJpeCBpcyB1c3VhbGx5IHJvdGF0ZWQgb3IgcmUtb3JpZW50ZWQgaW4gb3JkZXIgdG8gcmVjZWl2ZSB1bmNvcnJlbGF0ZWQgZmFjdG9ycy8gY29tcG9uZW50cy4gVGhlIGdvYWwgaXMgdG8gZmluZCBjbHVzdGVycyBvZiB2YXJpYWJsZXMgdGhhdCBhcmUgaGlnaGx5IGNvcnJlbGF0ZWQgYW5kIHRvIGxhcmdlIGV4dGVuZCBkZWZpbmUgb25seSBvbmUgZmFjdG9yLiAKCiogKipPcnRob2dvbmFsIHJvdGF0aW9uOioqIHByZXNlcnZlcyB0aGUgcGVycGVuZGljdWxhcml0eSBvZiB0aGUgYXhlcyAocmVtYWluIHVuY29ycmVsYXRlZCkKICAgICsgKipWYXJpbWF4Kio6IHByZXNlcnZlcyBzaW1wbGUgc3RydWN0dXJlIGJ5IGZvY3VzaW5nIG9uIHRoZSBjb2x1bW5zIG9mIHRoZSBmYWN0b3IgbG9hZGluZ3MgbWF0cml4LiBUaGUgS2Fpc2VyYHMgdmFyaW1heCByb3RhdGlvbiBhaW1zIHRvIG1heGltaXplIHRoZSBpbmRlcGVuZGVudCBzcXVhcmVkIGxvYWRpbmdzIHZhcmlhbmNlIGFjcm9zcyB2YXJpYWJsZXMgc3VtbWVkIG92ZXIgYWxsIGZhY3RvcnMuCiAgICArICoqUXVhcnRpbWF4Kiogcm90YXRpb24gLSBwcmVzZXJ2ZXMgc2ltcGxlIHN0cnVjdHVyZSBieSBmb2N1c2luZyBvbiB0aGUgcm93cyBvZiB0aGUgZmFjdG9yIGxvYWRpbmcgbWF0cml4CiogKipPYmxpcXVlIHJvdGF0aW9uIC0gYWxsb3dzIGZvciBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSByb3RhdGVkIGZhY3RvcnMuIFRoZSBwdXJwb3NlIGlzIHRvIGFsaWduIHRoIGVmYWN0b3IgYXhlcyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlIHRvIHRoZSBncm91cHMgb2YgdGhlIG9yaWdpbmFsIHZhcmlhYmxlcy4gVGhlIGdvYWwgaXMgdG8gZmFjaWxpdGF0ZSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHJlc3VsdHMgKG1vcmUgZGlzdHJpbWF0aXZlKS4KICAqICoqUHJvbWF4IHJvdGF0aW9uKioKCgpDb21tb24gZmFjdG9yIG1vZGVsIC0gb2JzZXJ2ZWQgdmFyaWFuY2UgaW4gZWFjaCBtZWFzdXJlIGlzIGF0dHJpYnV0YWJsZSB0byBhIHJlbGF0aXZlbHkgc21hbGwgbnVtYmVyIG9mIGNvbW1vbiBmYWN0b3JzIGFuZCBhIHNpbmdsZSBzcGVmaWNpZiBmYWN0b3IgKHVuY29ycmVsYXRlZCB0byBvdGhlciBmYWN0b3JzIGluIHRoZSBtb2RlbCkuIAoKbXkgb3BpbmlvbiAKCiQkeF97aTF9ID0gXGxhbWJkYV8xXHhpX3tpMX0gKyBcbGFtYmRhXzJceGlfe2kyfSArIC4uLiArIFxkZWx0YV9pICAkJAoKaGVyIG9waW5pb246CgokJHhfe2l9ID0gXGxhbWJkYV97aTF9XHhpXzEgKyBcbGFtYmRhX3tpMn1ceGlfMiArIC4uLiArIFxkZWx0YV9pICAkJAoKClRoZSBjb21tb24gYW5hbHlzaXMgaXMgYXBwcm9wcmlhdGUgd2hlbiB0aGVyZSBpcyBhICpsYXRlbnQgdHJhaXQqIG9yIHVub2JzZXJ2YWJsZSBjaGFyYWN0ZXJpc3RpY3MuIFVzZWQgd2l0aGluIHN1ZXJ2ZXkgcXVlc3Rpb25zIGFib3V0IGF0dGl0dWRlcy4gVGhlIGdvYWwgaXMgdG8gaWRlbnRpZnkgY29tbW9uIGZhY3RvcnMgY2FwdGVyaW5nIHRoZSB2YXJpYW5jZSBmcm9tIHRoZXNlIHF1ZXN0aW9ucyBhbmQgd2hpY2ggY2FuIGFsc28gYmUgdXNlZCBhcyBmYWN0b3Igc2NvcmVzLgoKKiBBc3N1bXB0aW9ucyB0byBkZXRlcm1pbmUgYSBzb2x1dGlvbiB0byB0aGUgY29tbW9uIGZhY3RvciBtb2RlbDoKICAgICsgVGhlIGNvbW1vbiBmYWN0b3JzIGFyZSB1bmNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyCiAgICArIFRoZSBzcGVjaWZpYyBmYWN0b3JzIGFyZSB1bmNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyLgogICAgKyBUaGUgY29tbW9uIGZhY3RvcnMgYW5kIHNwZWNpZmljIGZhY3RvcnMgYXJlIHVuY29ycmVsYXRlZCB3aXRoIGVhY2ggb3RoZXIuIAogICAgCiogVGhlIGNvbW11bmFsaXR5IGlzIHRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlIGluIFggYXR0cmlidXRhYmxlIHRvIHRoZSBjb21tb24gZmFjdG9ycwoKJCRoX2leMiA9IFxzdW1fayBcbGFtYmRhXjJfe2lrfSA9IDEtIFx0aGV0YV97aWt9XjIkJAp3aGVyZSAkXHRoZXRhX3tpa31eMiA9IHZhcihcZGVsdGFfaSkkIGlzIHRoZSBmY2F0b3IgdW5pcXVlbmVzcy4gCiogVGhlIHNvbHV0aW9uIHRvIHRoZSBjb21tb24gZmFjdG9yIG1vZGVsIGlzIGRldGVybWluZWQgYnkgb3JpZW50aW5nIHRoZSBmaXJzdCBmYWN0b3Igc28gdGhhdCBpdCBjYXB0dXJlcyB0aGUgZ3JlYXRlc3QgcG9zc2libGUgdmFyaW5hY2UgYnV0IGlzIHVuY29ycmVsYXRlZCB3aXRoIHRoZSBmaXJzdCBmYWN0b3IuCiogVGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gWCB2YXJpYWJsZXMgYW5kIHRoZSAuLi4gZmFjdG9ycyBhcmUgY2FsbGVkIGxvYWRpbmdzICRcTGFtYmRhJC4KKiBUaGUgZmFjdG9yIHNjb3JlcyBwcmVzZW50IHRoZSBwc29pdGlvbnMgb2YgdGhlIG9ic2VydmF0aW9ucyBpbiB0aGUgY29tbW9uIGZhY3RvciBzcGFjZS4gVGhlIGZhY3RwciBzY29yZSBjb2VmZmljaWVudHMgYXJlIGdpdmVuIGJ5IAoKJCRCID0gUl57LTF9XExhbWJkYV9jJCQKCndoZXJlIFIgaXMgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeAoqIFRoZSBmYWN0b3Igc2NvcmVzIGFyZSBjYWxjdWxhdGVkIGFzOgoKJCRcWGkgPSBYX1NCJCQKVGhlc2UgZmFjdG9yIHNjb3JlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIGRhdGEgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIHZhcmlhYmxlcy4gCgoKCgpgYGB7ciwgZXZhbCA9IEZ9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShzdXJ2aXZhbCkKZGF0YShsdW5nLCBwYWNrYWdlID0gInN1cnZpdmFsIikKc3VtbWFyeShlc3MkcmVsKQplc3Nfc3VydiA8LSBlc3MKZXNzX3N1cnYkeWVhciA8LSAyMDE3IC0gZXNzX3N1cnYkeWVhciAKc2YuZXNzIDwtIHN1cnZpdmFsOjpzdXJ2Zml0KFN1cnYoeWVhciwgZ25kcikgfiAxLCBkYXRhID0gZXNzX3N1cnYpCmdnc3VydihzZi5lc3MpCmBgYAoK